package com.xuecheng.content.service.impl;

import com.xuecheng.content.mapper.CourseCategoryMapper;
import com.xuecheng.content.model.dto.CourseCategoryTreeDto;
import com.xuecheng.content.model.po.CourseCategory;
import com.xuecheng.content.service.CourseCategoryService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: ws
 * Date: 2024-06-10
 * Time: 23:26
 */

@Service
public class CourseCategoryServiceImpl implements CourseCategoryService {


    @Resource
    private CourseCategoryMapper courseCategoryMapper;

    /**
     * 多级菜单树形结构
     * @param id
     * @return
     */
    @Override
    public List<CourseCategoryTreeDto> queryTreeNodes(String id) {
        // 查询分类信息
        List<CourseCategoryTreeDto> courseCategoryTreeDtos = courseCategoryMapper.selectTreeNodes(id);
        // 根据 id 将相同的 parentid 的分类放到同一个集合中
        // 1. 先将 list 转成 map，key 为 id，value 为 CourseCategoryTreeDto
        Map<String, CourseCategoryTreeDto> map = courseCategoryTreeDtos.stream().
                        // 把根节点排除
                        filter(item -> !item.getId().equals(id)).
                        // key 取到 id，value 取 CourseCategoryTreeDto 自身这个对象，(k1, k2) -> k1) 意思是如果遇到重复的 key，取 k1
                        collect(Collectors.toMap(CourseCategory::getId, value -> value, (k1, k2) -> k1));
        // 2. 遍历 courseCategoryTreeDtos，父节点为 id 的节点，同时将子节点填充到父节点中
        List<CourseCategoryTreeDto> categoryTreeDtos = new ArrayList<>();
        courseCategoryTreeDtos.forEach(item -> {
            // 找到根节点为 parentid 的子节点
            if (item.getParentid().equals(id)) {
                categoryTreeDtos.add(item);
            }
            // 找到每个子节点放在父节点的 childrenTreeNodes 属性中
            CourseCategoryTreeDto courseCategoryTreeDtoParent = map.get(item.getParentid());
            // 判断父节点属性集合是否未初始化
            if (courseCategoryTreeDtoParent != null) {
                if (courseCategoryTreeDtoParent.getChildrenTreeNodes() == null) {
                    courseCategoryTreeDtoParent.setChildrenTreeNodes(new ArrayList<>());
                }
                courseCategoryTreeDtoParent.getChildrenTreeNodes().add(item);
            }
        });


        return categoryTreeDtos;
    }
}
